// 导出admin
module.exports = app => {
  const express = require('express')
  const jwt = require('jsonwebtoken') // 引入jwt
  const assert = require('http-assert')
  const AdminUser = require('../../models/AdminUser')
  const router = express.Router(
    { mergeParams: true } // 合并url参数
  ) // 这是express的子路由

  // 登录校验中间件
  const authMiddleware = require('../../middleware/auth')

  // 通用curd中间件
  const resourceMiddleware = require('../../middleware/resource')

  // 创建
  router.post('/', async (req, res) => { // 添加分类名称
    const model = await req.Model.create(req.body) // 保存到数据库
    res.send(model)
  })
  // 更新
  router.put('/:id', async (req, res) => { // 修改分类名称
    const model = await req.Model.findByIdAndUpdate(req.params.id, req.body)
    res.send(model)
  })
  // 删除
  router.delete('/:id', async (req, res) => { // 删除分类名称
    await req.Model.findByIdAndDelete(req.params.id)
    res.send({
      success: true
    })
  })
  // 获取资源列表
  router.get('/', async (req, res) => {
    const queryOptions = {}
    if (req.Model.modelName === 'Category') {
      queryOptions.populate = 'parent'// 查询分类, populate 表示关联查询
    }
    const items = await req.Model.find().setOptions(queryOptions).limit(100)
    res.send(items)
  })
  // 获取资源详情
  router.get('/:id', async (req, res) => {
    const model = await req.Model.findById(req.params.id) // ID查询分类
    res.send(model)
  })

  app.use('/admin/api/rest/:resource', authMiddleware(), resourceMiddleware(), router)

  const multer = require('multer') // 上传文件中间件
  const upload = multer({ dest: __dirname + '/../../uploads' }) // 上传到 uploads文件夹
  app.post('/admin/api/upload', authMiddleware(), upload.single('file'), async (req, res) => {
    const file = req.file
    file.url = `http://king.helloxx.cn/uploads/${file.filename}`
    res.send(file)
  })

  app.post('/admin/api/login', async (req, res) => {
    const { username, password } = req.body
    // 根据用户名找用户
    const user = await AdminUser.findOne({ username }).select('+password')
    assert(user, 422, '用户不存在')
    // if (!user) {
    //   return res.status(422).send({
    //     message: '用户不存在'
    //   })
    // }
    // 校验密码
    const isValid = require('bcryptjs').compareSync(password, user.password)
    assert(isValid, 422, '密码错误')
    // if (!isValid) {
    //   return res.status(422).send({
    //     message: '密码错误'
    //   })
    // }
    // 返回token
    const token = jwt.sign({ id: user._id }, app.get('secret'))
    res.send({ token, username })
  })
  // 错误处理函数
  app.use(async (err, req, res, next) => {
    res.status(err.statusCode || 500).send({
      message: err.message
    })
  })
}